package com.special.requirement.Polymorphism;

/**
 * @author liuYC
 * @ClassName Polym01orphism
 * @Description TODO
 * @date 2021/5/6 18:05
 * 多条的效果：
 * <p>
 * 1.当父类的引用指向子类的对象时，该引用可以直接调用父类的成员方法，但是不可以直接
 * 调用子类的成员变量
 * 2.对于父子类都拥有的非静态成员方法来说，编译阶段调用父类的，
 * 运行阶段调用子类的
 * 3.对于父子类都拥有的静态成员方法来说，编译和运行阶段调用父类的版本，与对象无关。
 */


public class Pet {
    private String name;
    private int age;

    public Pet() {
        super();
    }

    public Pet(String name, int age) {
        super();
        setName(name);
        setAge(age);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age > 0 && age < 10) {
            this.age = age;
        } else {
            System.out.println("年龄不合法");
        }
    }

    public void show() {
        System.out.println("名字：" + getName() + ",年龄：" + getAge());
    }
}

class Cat extends Pet {
    private String color;

    public Cat() {
        super();
    }

    public Cat(String name, int age, String color) {
        super(name, age);
        setColor(color);
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public void show() {
        System.out.println("花色：" + getColor());
    }


    public static void main(String[] args) {
        //使用父类类型的引用指向父类自己的对象，没有多态
        Pet p1 = new Pet();
        //无论是否重写show（）方法，都调用Pet类中的show方法
        p1.show();
        System.out.println("----------------------");
        //使用子类类型的引用指向父类自己的对象，没有多态
        //当子类重写show（）方法后，则调用子类中重写以后的方法
        Cat c1 = new Cat("小花", 2, "白色");
        //调用Pet类中的show（）方法
        c1.show();
        System.out.println("----------------------");
        //父类类型的引用指向了子类的对象，形成了多态
        Pet pc = new Cat("喵咪", 3, "咖啡色");
        //调用Pet类的show方法
        //当子类重写show（）方法后，在运行阶段最终调用了子
        // 类重写以后的版本
        //在编译阶段还是调用父类的方法，运行阶段调子类
        pc.show();
    }
}

